Date.prototype.tos=function(part,sp){
    var hash={"0":"","1":"Date","2":"Time"} , ret , part=part || 0;
    //因为 toLocaleString的输出完全处决于客户机操作系统的设置，所以我们要先测试一下
    if ((new Date(2000,1,1,1,1,1)).toLocaleString()=="2000年2月1日 1:01:01"){
        ret=String(this["toLocale"+hash[part]+"String"]());
    }else{             //不是我们想要的格式，只能自己实现
        var yyyy=this.getFullYear();
        var nn=this.getMonth()+1;
        var dd=this.getDate();
        var hh=this.getHours();
        var mm=String("00"+this.getMinutes()).right(2);
        var ss=String("00"+this.getSeconds()).right(2);
        var dateString=yyyy+"年"+nn+"月"+dd+"日";
        var timeString=hh+":"+mm+":"+ss;
        hash={"0":dateString+" "+timeString,"1":dateString,"2":timeString};
        ret= hash[part];
    }
    return sp==undefined?ret.replace(/[年月]+/g,"-").replace("日",""):ret;
}
RegExp.prototype.tos=function(){
    return this.toString();
}
Number.prototype.tos=function(){
    return this.toString();
}
String.prototype.tos=function(){
    if (this.indexOf("'")!=-1){
        return '"'+this.replace(/"/g,'\\"')+'"';
    }else{
        return "'"+this.replace(/'/g,"\\'")+"'";
    }
}
/*
   "".left 和 "".right 模拟实现 vbs里面的 left和right函数，截取字符串
   不过这里的实现支持中文 ，会把一个汉字当两个字符来计算。
 */
String.prototype.right=function(n){
    return this.slice(this.slice(-n).replace(/[\x00-\xff]/g,"").length-n);
}
String.prototype.left=function(n){
    // alert("abcdefg".left(3)==="abc");alert("中国人cdefg".left(5)==="中国");    //alert("中国abcdefg".left(5)==="中国a")
    return this.slice(0,n-this.slice(0,n).replace(/[\x00-\xff]/g,"").length);
}
//列出函数名和参数列表，内容用替代
Function.prototype.tos=function(){
    var ret=this.toString();
    return ret.left(ret.indexOf(")"))+"){}";
}
Array.prototype.tos=function(){
    for(var i=0,arr=[];i<this.length;i++) {        arr.push(this[i].tos?this[i].tos():this[i].toString());    }
    return "["+arr.join(",")+"]";
}
Error.prototype.tos=function(){
    var str=this.number?"number["+this.number+"],":"" //FireFox不支持 Error.number
    return "Error: "+str+"message["+this.message+"]";
}   
/*
    功能:返回Object结构里面的各成员的key:value的一个友好字符串格式,方便debug
    listAll: 是否显示当前 Object的 prototype树中的成员
    tbs:  递归现实次级Object成员时的 tab缩进层数. (注意:代码中使用的是4个空格而非一个tab)
*/
Object.prototype.tos=function(listAll,tbs){
    var value,ret='{\n',obj=this;
    tbs=tbs || 0;
    listAll=listAll || 0;
    var prefix=Math.pow(10,tbs).tos().slice(1).replace(/0/g,"    ");
    for(var key in obj){
        if ((!obj.hasOwnProperty(key)&& !listAll)||(!!listAll&&key=="tos")) continue;
        value=obj[key];       
        switch(value.constructor){
            case String:
            case Date:
            case RegExp:
            case Array:
            case Number:
            case Function:
            case Error:
                value=value.tos();
                break;
            case Object:
                value=value.tos(listAll,++tbs);
                break;      
            default:
                try{value=value.toString();}catch(x){value=""};
        }
        ret=ret+[prefix+key," :  ",value,"\n"].join("");
    }
    ret+=prefix+"}";
    return ret;
}
